package main.leetcode.offer.firstround.from51to68;

/**
 * 58-II.左旋字符串
 *
 * <p>字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如，输入字符串"abcdefg"和数字2，该函数将返回左旋转两位得到的结果"cdefgab"。
 *
 * <p>
 *
 * <p>示例 1：输入: s = "abcdefg", k = 2 输出: "cdefgab"
 *
 * <p>示例 2：输入: s = "lrloseumgh", k = 6 输出: "umghlrlose"
 *
 * <p>限制：1 <= k < s.length <= 10000
 *
 * <p>来源：力扣（LeetCode） 链接：https://leetcode-cn.com/problems/zuo-xuan-zhuan-zi-fu-chuan-lcof
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class ex58II {
    public static void main(String[] args) {
        System.out.println(new ex58II().reverseLeftWords(new String("abcdefg"), 2));
    }

    public String reverseLeftWords(String s, int n) {
        //        return s.substring(n) + s.substring(0, n); // 面试作死写法

        // 三次反转
        // ab cde -> ba edc -> cde ab
        char[] chars = s.toCharArray();
        reverse(chars, 0, n - 1);
        reverse(chars, n, s.length() - 1);
        reverse(chars, 0, s.length() - 1);
        return String.valueOf(chars);
    }

    private void reverse(char[] chars, int left, int right) {
        while (left < right) {
            char c = chars[left];
            chars[left] = chars[right];
            chars[right] = c;
            ++left;
            --right;
        }
    }
}
